package com.nfit.shopcommon.utils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
import java.util.Base64;
/**
 * ClassName:AESUtil
 * Package:com.nfit.shopcommon.utils
 * Description
 *微信返回的用户信息是加密的，需要使用 AES-CBC 解密算法解密 encryptedData 数据。
 * @Author L
 * @Create 2024/12/27 9:36
 */
public class AESUtil {
    private final byte[] sessionKey; // 解密密钥
    private final byte[] iv; // 偏移量

    static {
        // 注册 BouncyCastle 提供者
        Security.addProvider(new BouncyCastleProvider());
    }

    public AESUtil(String sessionKey, String iv) {
        // Base64 解码后存储密钥和偏移量
        this.sessionKey = Base64.getDecoder().decode(sessionKey);
        this.iv = Base64.getDecoder().decode(iv);

        // 校验密钥和偏移量长度（AES-128 密钥长度应为 16 字节）
        if (this.sessionKey.length != 16) {
            throw new IllegalArgumentException("解密密钥（sessionKey）长度必须为 16 字节");
        }
        if (this.iv.length != 16) {
            throw new IllegalArgumentException("偏移量（iv）长度必须为 16 字节");
        }
    }

    public String decrypt(String encryptedData) throws Exception {
        // Base64 解码加密数据
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData);

        // 创建 AES 密钥和 IV 参数
        SecretKeySpec keySpec = new SecretKeySpec(sessionKey, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv);

        // 创建 Cipher 实例并初始化
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); // 使用 BouncyCastle
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

        // 解密数据
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes, "UTF-8");
    }
}



